package com.tedu.day02.oop;

/**
 * 抽象类特点<补充>
 *      类：成员变量/成员方法/构造方法
 *      抽象类：成员变量/成员方法/构造方法
 *      创建抽象类---普通类变成（实现）子类---继承抽象类
 *      成员变量：即可以变量，也可以常量
 *      构造方法：有，用于子类访问的调用抽象【父】类的成员变量---赋值
 *      构造方法：既可以是抽象，非抽象
 *      抽象方法与非抽象方法出现在抽象类方法:
 *      A:抽象方法 【重写】强制要求子类完成父类的抽象方法
 *      B：非抽象方法 【拓展】子类继承的事情，提高代码的复用性
 */
abstract class Foo{
    //成员变量
    public int i=10;
    public int J=20;//成员变量：常量
    //Java强类型语言:大小写分明
    //public int j=30;
    //构造方法:无参
    public Foo() {

        this(30);//调用当前类对象的其他构造器
    }

    public Foo(int i) {

        this.i = i;
    }
    //成员方法:抽象方法
    public abstract void show();
    //成员方法：非抽象方法
    public void method(){
        System.out.println("Foo     method");
    }
}

//实现 {子}类
class Goo extends Foo{
    public Goo() {
        super();
    }

    public void show()
    {
        System.out.println("Goo show");
    }
    public void method()
    {
        System.out.println("Goo method");
    }
}


public class 抽象类补充知识点 {
    public static void main(String[] args) {
        //抽象类----继承----多态性----向上造型
        Foo f=new Goo();
        //①实例化---子类构造器，默认存在无参构造器,
        // 在通过super()调用父类无参构造器
        //②执行抽象类无参构造器，发现有this(参数)调用本类其他有参构造器
        //③this调用的同时，完成抽象类中 i 进行赋值 i=30
        System.out.println(f.i);  //④输出: i的值 30
        //f.J=40; 不可修改
        System.out.println(f.J);

        //---------------------------------
        f.show();   //输出：Goo show   重写
        f.method(); //输出：Goo method 拓展【子类方法重写】
    }
}


/*拓展：abstract关键字共存问题*/
abstract class Aoo{
    //private abstract void show1();  冲突
//    public final abstract void show2(); 冲突
   // public static abstract void show3();
    //无意义:静态方法需要加语法块{}，抽象方法
}
